<?php
/**
 * Базовый класс заказа
 *
 * @author Mike
 */
class Order extends ActiveRecord {
	protected $tableName = 'order';
	protected $pkName = 'ID_order';
	
	protected $arrSettings = array('created_at' => true); // 'author' => true ставить здесь нельзя, иначе после создания заказа незалогиненным пользователм id будет браться из сеанса, а пользователя там нет
	
	public $validatesLengthOf = array(
			'first_name' => array('min' => 2, 'max' => 64, 'message' => 'Имя должно состоять из 2-64 символов'),
			'last_name' => array('min' => 2, 'max' => 64, 'message' => 'Фамилия должна состоять из 2-64 символов'),
			'address' => array('min' => 2, 'max' => 1000, 'message' => 'Адрес - не менее 2 символов'),
			'city' => array('min' => 2, 'max' => 1000, 'message' => 'Город - не менее 2 символов')
	);
	
	public $validatesFormatOf = array(
			'e_mail' => array('with' => '/^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})$/i', 'message' => 'Электронная почта заполнена неверно'),
			'first_name' => array('message' => 'Имя - только русские и латинские буквы', 'with' => '/^[а-яa-z]*$/iu'),
			'last_name' => array('message' => 'Фамилия - только русские и латинские буквы', 'with' => '/^[а-яa-z]*$/iu'),
			'phone' => array('message' => 'Телефон - от 10 до 15 цифр', 'with' => '/^[0-9]{10,15}$/i'),
			'post_index' => array('message' => 'Индекс - от 3 до 10 цифр', 'with' => '/^[0-9]{3,10}$/i', 'allowNull' => true)
	);
	
	public function afterValidation() {
		$objUser = User_Seance::getUser();
		if(!$objUser->id) {	// Если пользователь не авторизован, то надо его регистрировать
			$objUser->setFields(array(
					'first_name' => $this->getField('first_name'),
					'last_name' => $this->getField('last_name'),
					'phone' => $this->getField('phone'),
					'e_mail' => $this->getField('e_mail'),
					'password' => $this->getField('password'),
					'confirm' => $this->getField('confirm'),
			));
			
			if(!$objUser->save()) $this->arrErrors = array_merge($this->arrErrors, $objUser->arrErrors);
			else User_Seance::authorizationIn($objUser);
			
			unset($this->tableFields['password']);
			unset($this->tableFields['confirm']);
		}
		
		$this->setField('ID_user', $objUser->id);
	}
	
	public function beforeCreate() {
		$this->tableFields['status'] = 1;
	}
	
	/**
	 * (non-PHPdoc)
	 * @see ActiveRecord::afterCreate()
	 */
	public function afterCreate() {
		$objDB = Service_Database::instanse();
		$arrCondition = Cart::getArrCondition();
		
		// Получаем сущности таблицы cart, присутствующие в заказе
		$stmt = "SELECT `cart`.`ID_cart`, `cart`.`amount`, `product`.`client_price`
				FROM `cart`
				INNER JOIN `product` USING(`ID_product`)
				WHERE " . $arrCondition['field'] . " = '" . $arrCondition['value'] . "' AND `cart`.`is_order` = 0";
		$arrCartsItems = $objDB->select($stmt);
		
		// Проставляем связи в таблицу order_cart, при этом получаем сумму заказа и  массив айдишников сущностей таблицы cart
		$i = 0;
		$orderPrice = 0;
		$arrCartItemsIds = array();
		$stmt = "INSERT INTO `order_cart`(`ID_order`, `ID_cart`) VALUES";
		foreach($arrCartsItems as $arrCartsItem) {
			$oneInsertValue = $i++ ? ',' : '';
			$oneInsertValue .= "('" . $this->id . "', '" . $arrCartsItem['ID_cart'] . "')";
			$stmt .= $oneInsertValue;
			
			$orderPrice += $arrCartsItem['client_price'] * $arrCartsItem['amount'];
			$arrCartItemsIds[] = $arrCartsItem['ID_cart'];
		}
		$objDB->query($stmt);
		
		// Обновляем статусы сущностей таблицы cart
		$stmt = "UPDATE `cart`
				SET `cart`.`is_order`= 1
				WHERE `cart`.`ID_cart` IN(" . implode(',', $arrCartItemsIds) . ")";
		$objDB->query($stmt);
		
		$this->updateFields(array('order_price' => $orderPrice));
	}
}
